﻿using System;
using System.Data.Objects;
using System.Linq.Expressions;
using System.Reflection;

namespace AutoStopData.Model
{
    public static class ObjectQueryIncludeExtension
    {


        public static ObjectQuery<T> Include<T>(this ObjectQuery<T> mainQuery, Expression<Func<T, object>> subSelector)
        {
            return mainQuery.Include(FuncToString(subSelector.Body));
        }

        private static string FuncToString(Expression selector)
        {
            switch (selector.NodeType)
            {
                case ExpressionType.MemberAccess:
                    string retVal = String.Empty;
                    MemberExpression tmpExpr = selector as MemberExpression;
                    if (tmpExpr.Expression.NodeType == ExpressionType.MemberAccess)
                    {
                        retVal = FuncToString(tmpExpr.Expression) + ".";
                    }
                    retVal = retVal + ((selector as MemberExpression).Member as PropertyInfo).Name;
                    return retVal;
                case ExpressionType.Call:
                    var method = selector as MethodCallExpression;
                    return FuncToString(method.Arguments[0]) + "." + FuncToString(method.Arguments[1]);
                case ExpressionType.Quote:
                    return FuncToString(((selector as UnaryExpression).Operand as LambdaExpression).Body);
            }
            throw new InvalidOperationException();
        }

        public static K Include<T, K>(this TrackableCollection<T> mainQuery, Expression<Func<T, object>> subSelector)
            where T : IObjectWithChangeTracker
            where K : class
        {
            return null;
        }

        public static K Include<T, K>(this T mainQuery, Expression<Func<T, object>> subSelector)
            where T : IObjectWithChangeTracker
            where K : class
        {
            return null;
        }
    }
}
